/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.beaninfo.editors; import java.awt.*; import java.awt.event.*; import java.beans.*; import java.util.ResourceBundle; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.*; import org.openide.explorer.propertysheet.editors.EnhancedCustomPropertyEditor; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; /** A custom property editor for TableModel. * @author Jan Jancura, Ian Formanek * @version 1.00, 06 Oct 1998 */ public class CustomTableModelEditor extends JPanel implements EnhancedCustomPropertyEditor { // the bundle to use static ResourceBundle bundle = NbBundle.getBundle ( CustomTableModelEditor.class); private JTable defaultValuesTable; private JTextField rowsField; private JTextField columnsField; private TableModelEditor.NbTableModel model; private TableModelEditor.NbTableModel titleModel; private boolean isCreated = false; private boolean isChangingTableModel = false; static final long serialVersionUID =8002510111948803668L; public CustomTableModelEditor (TableModelEditor editor) { model = new TableModelEditor.NbTableModel ((TableModel)editor.getValue ()); setLayout (new BorderLayout ()); setBorder (new EmptyBorder (6, 6, 6, 6)); JTabbedPane tabbedPane = new JTabbedPane (); JPanel tab = new JPanel (); tab.setLayout (new BorderLayout (6, 6)); tab.setBorder (new EmptyBorder (6, 0, 0, 6)); tab.add ("North", new JLabel ( // NOI18N bundle.getString ("CTL_Title1") )); JTable settingsTable = new JTable (); settingsTable.addKeyListener (new KeyAdapter () { public void keyPressed (KeyEvent e) { if (e.getKeyChar () == KeyEvent.VK_ENTER) { e.consume (); } } }); titleModel = new TableModelEditor.NbTableModel ( new String[] { bundle.getString ("CTL_Column"), bundle.getString ("CTL_Title"), bundle.getString ("CTL_Type"), bundle.getString ("CTL_Editable") }, new Class[] { String.class, String.class, String.class, Boolean.class }, new boolean[] { false, true, true, true } ); settingsTable.setModel (titleModel); JComboBox comboBox = new JComboBox(); comboBox.addItem ("String"); // NOI18N comboBox.addItem ("Boolean"); // NOI18N comboBox.addItem ("Integer"); // NOI18N comboBox.addItem ("Byte"); // NOI18N comboBox.addItem ("Short"); // NOI18N comboBox.addItem ("Long"); // NOI18N comboBox.addItem ("Float"); // NOI18N comboBox.addItem ("Double"); // NOI18N comboBox.addItem ("Character"); // NOI18N comboBox.setSelectedIndex (0); TableColumn typeColumn = settingsTable.getColumn (bundle.getString ("CTL_Type")); typeColumn.setCellEditor (new DefaultCellEditor (comboBox)); JScrollPane jscrollpane = new JScrollPane (settingsTable); settingsTable.setSelectionMode (0); settingsTable.setCellSelectionEnabled (true); settingsTable.setRowSelectionAllowed (true); settingsTable.setColumnSelectionAllowed (true); settingsTable.setPreferredScrollableViewportSize (new Dimension (450, 300)); tab.add ("Center", jscrollpane); // NOI18N JPanel sizePanel = new JPanel (); sizePanel.setLayout (new java.awt.GridBagLayout ()); java.awt.GridBagConstraints gridBagConstraints1; JLabel rowsLabel = new JLabel (); rowsLabel.setText (bundle.getString ("CTL_Rows")); gridBagConstraints1 = new java.awt.GridBagConstraints (); gridBagConstraints1.insets = new java.awt.Insets (0, 0, 0, 5); gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST; sizePanel.add (rowsLabel, gridBagConstraints1); rowsField = new JTextField (); gridBagConstraints1 = new java.awt.GridBagConstraints (); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints1.insets = new java.awt.Insets (0, 0, 5, 0); gridBagConstraints1.weightx = 1.0; gridBagConstraints1.ipadx = 20; sizePanel.add (rowsField, gridBagConstraints1); JLabel columnsLabel = new JLabel (); columnsLabel.setText (bundle.getString ("CTL_Columns")); gridBagConstraints1 = new java.awt.GridBagConstraints (); gridBagConstraints1.insets = new java.awt.Insets (0, 0, 0, 5); gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST; sizePanel.add (columnsLabel, gridBagConstraints1); columnsField = new JTextField (); gridBagConstraints1 = new java.awt.GridBagConstraints (); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints1.weightx = 1.0; gridBagConstraints1.ipadx = 20; sizePanel.add (columnsField, gridBagConstraints1); JPanel padding = new JPanel (); padding.setLayout (new java.awt.FlowLayout ()); gridBagConstraints1 = new java.awt.GridBagConstraints (); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints1.weightx = 1.0; gridBagConstraints1.weighty = 1.0; sizePanel.add (padding, gridBagConstraints1); tab.add ("East", sizePanel); // NOI18N tabbedPane.addTab (bundle.getString ("CTL_Title2"), tab); tab = new JPanel (); tab.setLayout (new BorderLayout (6, 6)); tab.setBorder (new EmptyBorder (6, 0, 0, 0)); tab.add ("North", new JLabel (bundle.getString ("CTL_DefaultTableValues"))); defaultValuesTable = new JTable (); defaultValuesTable.setModel (model); model.alwaysEditable = true; jscrollpane = new JScrollPane (defaultValuesTable); defaultValuesTable.setSelectionMode (0); defaultValuesTable.setCellSelectionEnabled (true); defaultValuesTable.setRowSelectionAllowed (true); defaultValuesTable.setColumnSelectionAllowed (true); defaultValuesTable.setPreferredScrollableViewportSize (new Dimension (450, 80)); defaultValuesTable.addKeyListener (new KeyAdapter () { public void keyPressed (KeyEvent evt) { if (evt.getKeyChar () == KeyEvent.VK_ENTER) { evt.consume (); } } }); tab.add ("Center", jscrollpane); // NOI18N tabbedPane.addTab (bundle.getString ("CTL_DefaultValues"), tab); add ("Center", tabbedPane); // NOI18N rowsField.setText (String.valueOf (model.getRowCount ())); columnsField.setText (String.valueOf (model.getColumnCount ())); rowsField.addFocusListener (new FocusAdapter () { public void focusLost (FocusEvent evt) { updateRows (rowsField.getText ()); } } ); rowsField.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent evt) { updateRows (rowsField.getText ()); } } ); columnsField.addFocusListener (new FocusAdapter () { public void focusLost (FocusEvent evt) { updateColumns (columnsField.getText ()); } } ); columnsField.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent evt) { updateColumns (columnsField.getText ()); } } ); updateTitleModel (); isCreated = true; HelpCtx.setHelpIDString (this, CustomTableModelEditor.class.getName ()); titleModel.addTableModelListener (new TableModelListener () { public void tableChanged (TableModelEvent evt) { updateDefaultTable (); } } ); } private void updateRows (String text) { int i = 0; try { i = Integer.parseInt (text); } catch (NumberFormatException e) { return; } if (i < 1) return; model.setRowCount (i); } private void updateColumns (String text) { int i = 0; try { i = Integer.parseInt (text); } catch (NumberFormatException e) { return; } if (i < 1) return; model.setColumnCount (i); updateTitleModel (); } void updateDefaultTable () { if (model==null || isChangingTableModel) return; //at component creation int cols = model.getColumnCount (); int rows = model.getRowCount (); int i; boolean typeChanged = false; for (i = 0; i < cols; i++) { model.titles [i] = (String) titleModel.data [i] [1]; String t = (String) titleModel.data [i] [2]; Class newType; try { newType = Class.forName ("java.lang." + t); // NOI18N } catch (Exception e) { newType = String.class; } if (!newType.equals (model.types [i])) { typeChanged = true; model.types [i] = newType; int j; for (j = 0; j < rows; j++) model.data [j] [i] = null; // getDefaultValue (newType); [PENDING] } model.editable [i] = ((Boolean)titleModel.data [i] [3]).booleanValue (); } if (typeChanged) defaultValuesTable.createDefaultColumnsFromModel (); model.fireTableChanged (); } /** * @return Returns the property value that is result of the CustomPropertyEditor. * @exception InvalidStateException when the custom property editor does not represent valid property value * (and thus it should not be set) */ public Object getPropertyValue () throws IllegalStateException { updateDefaultTable (); return new TableModelEditor.NbTableModel (model); } void updateTitleModel () { isChangingTableModel=true; int cols = model.getColumnCount (); if (cols != titleModel.getRowCount ()) { isCreated = false; titleModel.setRowCount (cols); isCreated = true; } int i; for (i = 0; i < cols; i++) { titleModel.data [i][0] = "" + (i + 1); // NOI18N titleModel.data [i][1] = model.titles [i]; String s = model.types [i].getName (); int g = s.lastIndexOf ('.'); if (g >= 0) s = s.substring (g + 1, s.length ()); titleModel.data [i][2] = s; titleModel.data [i][3] = new Boolean (model.editable [i]); } isChangingTableModel = false; updateDefaultTable (); } } // class CustomTableModelEditor /* * Log * 10 Gandalf 1.9 1/13/00 Petr Jiricka i18n * 9 Gandalf 1.8 12/17/99 Pavel Buzek #4196 * 8 Gandalf 1.7 10/22/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 7 Gandalf 1.6 8/17/99 Ian Formanek Generated serial version * UID * 6 Gandalf 1.5 8/2/99 Ian Formanek Fixed bug 1826 - The * table model property sheet is unusable, Plus improved focus * 5 Gandalf 1.4 7/8/99 Jesse Glick Context help. * 4 Gandalf 1.3 6/30/99 Ian Formanek Reflecting changes in * editors packages and enhanced property editor interfaces * 3 Gandalf 1.2 6/8/99 Ian Formanek ---- Package Change To * org.openide ---- * 2 Gandalf 1.1 3/4/99 Jan Jancura bundle moved * 1 Gandalf 1.0 1/5/99 Ian Formanek * $ */